from wtforms import Form, StringField
from wtforms.validators import DataRequired, Email, Regexp, ValidationError
from model.user import UserManager
from werkzeug.security import check_password_hash
from libs.error_code import FormValidateException


class UserForm(Form):
    #                                  列表形式，支持多个校验，DataRequired()表示数据必须要传
    username = StringField(validators=[DataRequired()])
    #                                               邮箱格式校验
    email = StringField(validators=[DataRequired(), Email(message="邮箱不合法")])
    #                                                   6-18位的单词
    password = StringField(validators=[DataRequired(), Regexp(r'\w{6,18}', message="密码不符合要求")])
    #                                               以1开头，后接10个数字，否则提示电话不符合要求
    phone = StringField(validators=[DataRequired(), Regexp(r'1\d{10}', message="电话不符合要求+")])

    # 自定义验证器，验证邮箱是否唯一
    # 自定义检查字段 方法名：validate_你要检查的字段
    def validate_email(self, value):
        if UserManager.query.filter_by(email=value.data).first():
            raise ValidationError("邮箱已存在")

    def validate_name(self, value):
        # 对数据进行修改，给客户端传进来的所有用户名都加一个sanchuang-开头
        value.data = "sanchuang-" + value.data


class LoginForm(Form):
    # 实际验证的是email
    userName = StringField(validators=[DataRequired(), Email(message="邮箱不合法")])
    password = StringField(validators=[DataRequired(), Regexp(r'\w{6,18}', message="密码不符合要求")])

    def validate(self):
        # 执行父类的validate()，即form本身的validate()，去校验上面两个字段（邮箱和密码）
        super().validate()
        # 有错误就返回False
        if self.errors:
            return False
        # 去数据库查询email字段
        user = UserManager.query.filter_by(email=self.userName.data).first()
        # user.password是数据库里的密文密码，self.password.data是明文密码
        if user and check_password_hash(user.password, self.password.data):
            return user
        else:
            raise FormValidateException
